home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 February
/
EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso
/
earcd
/
util4
/
arud220.lha
/
Arud220
/
arud.s
< prev
Wrap
Text File
|
1995-11-10
|
49KB
|
2,661 lines
;-----------------------------------------------------------------------------
; Arud Converter v2.1
; by Morten Amundsen
;
; start: Monday, 16/10 1995, 09:46 PM
; end: Sunday, 22/10 1995, 02:34 PM
;
; Arud Converter V2.01
; (Rename .info file also, if they exists)
;
; start: Friday, 27/10 1995, 04:09 PM
; end: Friday, 27/10 1995, 04:24 PM
;
; Arud Converter V2.1
; (Add a gadget to reverse the order of renaming)
;
; start: Monday, 06/11 1995, 21:33
; end: Monday, 06/11 1995, 22:02
;
; Arud Converter V2.2
; (Added the option of either renaming, copying or copying to a specified
; directory plus "Places needed" now also shows max number of places
; used in number sequence.)
;
; start: Thursday, 09/11 1995, 20:27
; end: Friday, 10/11 1995, 14:08
;
; Assembled in PhxAss 4.23
;-----------------------------------------------------------------------------
VERSION = 39 ; kick version
WB = 1 ; wb startup (0=no)
;-----------------------------------------------------------------------------
NAME: MACRO
dc.b "arud "
ENDM
VER: MACRO
dc.b "2"
ENDM
REV: MACRO
dc.b "2"
ENDM
DATE: MACRO
dc.b "(10.11.95)"
ENDM
VERSTR: MACRO
dc.b "$VER: "
NAME
VER
dc.b "."
REV
dc.b " by Morten Amundsen "
DATE
dc.b 10,13,0
ENDM
;-----------------------------------------------------------------------------
include "misc/lvooffsets.i"
include "misc/macros.i"
include "graphics/gfxbase.i"
include "dos/dosextens.i"
include "intuition/intuition.i"
include "libraries/gadtools.i"
include "libraries/reqtools.i"
include "exec/memory.i"
XDEF _main
XDEF _DOSBase
XDEF _GfxBase
XDEF _IntuitionBase
XDEF _GadToolsBase
XDEF _ReqToolsBase
;-----------------------------------------------------------------------------
MAGIC: equ 5 ; "magic" pixel value
GAD_PBUTTON: equ 0
GAD_PSTRING: equ 1
GAD_BASETEXT: equ 2
GAD_REQPLACE: equ 3
GAD_NOFILES: equ 4
GAD_RANGE: equ 5
GAD_NEWBASE: equ 6
GAD_PLACES: equ 7
GAD_STARTVAL: equ 8
GAD_LEADING: equ 9
GAD_CONVERT: equ 10
GAD_QUIT: equ 11
GAD_FORCE: equ 12
GAD_DIRECTION: equ 13
GAD_ACTION: equ 14
GAD_PLACEUSE: equ 15
SUMGAD: equ 16 ; number of gadgets
PATHLEN: equ 128 ; no. of chars in path
BASELEN: equ 20 ; no. of chars in base
PLACESLEN: equ 10 ; max no of numbers in integer.
; BASELEN+PLACESLEN should equal 30
FILELEN: equ 30 ; length of filename
PCALCLEN: equ 40 ; no of chars to calc window width
STRUCTURE ArudFile,0
STRUCT af_Node,MLN_SIZE
APTR af_Name
ULONG af_Count
LABEL af_SIZEOF
;-----------------------------------------------------------------------------
_main: movem.l d0-d7/a0-a6,-(a7)
IFD WB
bsr.w FIND_WBMSG
ENDC
lea ArudList,a0
NEWLIST a0
OPENLIB DOSName,VERSION,_DOSBase
beq.s EXIT
OPENLIB GfxName,VERSION,_GfxBase
beq.s EXIT
OPENLIB IntuitionName,VERSION,_IntuitionBase
beq.s EXIT
OPENLIB GadToolsName,VERSION,_GadToolsBase
beq.s EXIT
OPENLIB ReqToolsName,38,_ReqToolsBase
beq.s EXIT
moveq #RT_REQINFO,d0
sub.l a0,a0
CALL rtAllocRequestA,_ReqToolsBase
move.l d0,_InfoReq
beq.s EXIT
moveq #RT_FILEREQ,d0
sub.l a0,a0
CALL rtAllocRequestA,_ReqToolsBase
move.l d0,_FileReq
beq.s EXIT
; get initial values (fontheight, fontwidth and titleheight) from WB screen.
lea WorkbenchName,a0
CALL LockPubScreen,_IntuitionBase
move.l d0,_WBScr
beq.s EXIT
move.w #1,WBLock
move.l d0,a0
move.l sc_Font(a0),a0
bsr.w GET_FONT_DATA
beq.s EXIT
moveq #0,d0
move.l _WBScr,a0
move.b sc_BarHeight(a0),d0
move.w d0,TitleHeight
sub.l a1,a1
CALL GetVisualInfoA,_GadToolsBase
move.l d0,d7
lea WorkbenchName,a0
CALL UnlockPubScreen,_IntuitionBase
clr.w WBLock
move.l d7,_VisualInfo
beq.s EXIT
; set VisualInfo in bevelbox taglist
SETTAG #BevelTags,GT_VisualInfo,d7
; calc window height & width
move.w TitleHeight,d0
move.w GadgetHeight,d1
mulu #11,d1 ; 11 lines of gadgets
add.w d1,d0
add.w #MAGIC*16,d0 ; "magic" space between gads
move.w d0,WindowHeight
move.l _WBScr,a0
move.w sc_Height(a0),d1 ; if window is higher than screen...
cmp.w d0,d1
bge.s OK_HEIGHT
move.l _Font,a1
CALL CloseFont,_GfxBase
move.l #0,_Font
lea TopazAttr,a0 ; ...adjust to topaz.font 8
bsr.w GET_FONT_DATA
beq.w EXIT
move.w TitleHeight,d0
move.w GadgetHeight,d1
mulu #11,d1 ; 11 lines of gadgets
add.w d1,d0
add.w #MAGIC*16,d0
move.w d0,WindowHeight
OK_HEIGHT:
lea PCalcIT,a0
move.l _TextAttr,it_ITextFont(a0)
CALL IntuiTextLength,_IntuitionBase
add.w #MAGIC*2,d0
move.w d0,WindowWidth
;---------------------------------------------------------------------
; calc all gadget positions
;-----------------
; PATH button
;-----------------
lea ForceIT,a0
move.l _TextAttr,it_ITextFont(a0)
CALL IntuiTextLength,_IntuitionBase
lea PButtonS,a0
add.w #MAGIC*2,d0
move.w d0,gng_Width(a0)
move.w #MAGIC*2,gng_LeftEdge(a0)
move.w TitleHeight,d0
add.w #MAGIC,d0
move.w d0,gng_TopEdge(a0)
move.w GadgetHeight,gng_Height(a0)
move.w FontWidth,d0
;----------------
; PATH string
;----------------
lea PStringS,a0 ; 'Path' string
move.w TitleHeight,d0
add.w #MAGIC,d0
move.w d0,gng_TopEdge(a0)
move.w GadgetHeight,gng_Height(a0)
lea PButtonS,a1
move.w gng_Width(a1),d0
move.w d0,d1
add.w #MAGIC*3,d1
move.w d1,gng_LeftEdge(a0)
move.w WindowWidth,d0
sub.w d1,d0
sub.w #MAGIC*2,d0
move.w d0,gng_Width(a0)
;---------------------------------------------------------------------
; BASENAME text
;------------------
lea BaseTextS,a0
move.w TitleHeight,d0
add.w GadgetHeight,d0
add.w #MAGIC*3,d0
move.w d0,gng_TopEdge(a0)
move.w WindowWidth,d0
lsr.w #1,d0
move.w d0,gng_LeftEdge(a0)
sub.w #MAGIC*4,d0
move.w d0,gng_Width(a0)
move.w GadgetHeight,gng_Height(a0)
;---------------------------------------------------------------------
; REQPLACE number
;------------------
lea ReqPlaceS,a0
move.w TitleHeight,d0
move.w GadgetHeight,d1
lsl.w #1,d1
add.w d1,d0
add.w #MAGIC*4,d0
move.w d0,gng_TopEdge(a0)
move.w WindowWidth,d0
lsr.w #1,d0
move.w d0,gng_LeftEdge(a0)
move.w d0,d7
sub.w #MAGIC*4,d0
lsr.w #1,d0
sub.w #MAGIC,d0
move.w d0,gng_Width(a0)
move.w d0,d6
add.w d0,d7
move.w GadgetHeight,gng_Height(a0)
;--------------------------------------------------------------------
; PLACESUSED number
;-----------------------
lea PlaceUseS,a0
move.w TitleHeight,d0
move.w GadgetHeight,d1
lsl.w #1,d1
add.w d1,d0
add.w #MAGIC*4,d0
move.w d0,gng_TopEdge(a0)
add.w #MAGIC*2,d7
move.w d7,gng_LeftEdge(a0)
move.w d6,gng_Width(a0)
move.w GadgetHeight,gng_Height(a0)
;---------------------------------------------------------------------
; NOFILES number
;------------------
lea NoFilesS,a0
move.w TitleHeight,d0
move.w GadgetHeight,d1
mulu #3,d1
add.w d1,d0
add.w #MAGIC*5,d0
move.w d0,gng_TopEdge(a0)
move.w WindowWidth,d0
lsr.w #1,d0
move.w d0,gng_LeftEdge(a0)
sub.w #MAGIC*4,d0
move.w d0,gng_Width(a0)
move.w GadgetHeight,gng_Height(a0)
;---------------------------------------------------------------------
; RANGE text
;------------------
lea RangeS,a0
move.w TitleHeight,d0
move.w GadgetHeight,d1
lsl.w #2,d1
add.w d1,d0
add.w #MAGIC*6,d0
move.w d0,gng_TopEdge(a0)
move.w WindowWidth,d0
lsr.w #1,d0
move.w d0,gng_LeftEdge(a0)
sub.w #MAGIC*4,d0
move.w d0,gng_Width(a0)
move.w GadgetHeight,gng_Height(a0)
;---------------------------------------------------------------------
; NEWBASE string
;------------------
lea NewBaseS,a0
move.w TitleHeight,d0
move.w GadgetHeight,d1
mulu #5,d1
add.w d1,d0
add.w #MAGIC*9,d0
move.w d0,gng_TopEdge(a0)
move.w d0,d7
move.w WindowWidth,d0
lsr.w #1,d0
move.w d0,gng_LeftEdge(a0)
sub.w #MAGIC*4,d0
move.w d0,gng_Width(a0)
move.w GadgetHeight,gng_Height(a0)
;------------------
; FORCE cycle
;------------------
lea ForceIT,a0
move.l _TextAttr,it_ITextFont(a0)
CALL IntuiTextLength,_IntuitionBase
lea ForceS,a0
add.w #MAGIC*2,d0
add.w #32,d0
move.w d0,gng_Width(a0)
move.w d7,gng_TopEdge(a0)
move.w #MAGIC*3,gng_LeftEdge(a0)
move.w GadgetHeight,gng_Height(a0)
;---------------------------------------------------------------------
; PLACES integer
;------------------
lea PlacesS,a0
move.w TitleHeight,d0
move.w GadgetHeight,d1
mulu #6,d1
add.w d1,d0
add.w #MAGIC*10,d0
move.w d0,gng_TopEdge(a0)
move.w WindowWidth,d0
lsr.w #1,d0
move.w d0,gng_LeftEdge(a0)
sub.w #MAGIC*4,d0
move.w d0,gng_Width(a0)
move.w GadgetHeight,gng_Height(a0)
;---------------------------------------------------------------------
; STARTVAL integer
;------------------
lea StartValS,a0
move.w TitleHeight,d0
move.w GadgetHeight,d1
mulu #7,d1
add.w d1,d0
add.w #MAGIC*11,d0
move.w d0,gng_TopEdge(a0)
move.w WindowWidth,d0
lsr.w #1,d0
move.w d0,gng_LeftEdge(a0)
sub.w #MAGIC*4,d0
move.w d0,gng_Width(a0)
move.w GadgetHeight,gng_Height(a0)
;---------------------------------------------------------------------
; LEADING cycle
;------------------
lea LeadingS,a0
move.w TitleHeight,d0
move.w GadgetHeight,d1
mulu #8,d1
add.w d1,d0
add.w #MAGIC*13,d0
move.w d0,gng_TopEdge(a0)
move.w #MAGIC*2,gng_LeftEdge(a0)
move.w WindowWidth,d0
sub.w #MAGIC*4,d0
move.w d0,gng_Width(a0)
move.w GadgetHeight,gng_Height(a0)
;--------------------------------------------------------------------
; DIRECTION cycle
;-----------------------
lea DirectionS,a0
move.w TitleHeight,d0
move.w GadgetHeight,d1
mulu #9,d1
add.w d1,d0
add.w #MAGIC*14,d0
move.w d0,gng_TopEdge(a0)
move.w #MAGIC*2,gng_LeftEdge(a0)
move.w WindowWidth,d0
sub.w #MAGIC*4,d0
move.w d0,gng_Width(a0)
move.w GadgetHeight,gng_Height(a0)
;---------------------------------------------------------------------
; CONVERT button
;------------------
lea ConvertS,a0
move.w TitleHeight,d0
move.w GadgetHeight,d1
mulu #10,d1
add.w d1,d0
add.w #MAGIC*15,d0
move.w d0,gng_TopEdge(a0)
move.w #MAGIC*2,gng_LeftEdge(a0)
move.w WindowWidth,d0
lsr.w #2,d0
move.w d0,gng_Width(a0)
move.w d0,d7
move.w GadgetHeight,gng_Height(a0)
;---------------------------------------------------------------------
; QUIT button
;------------------
lea QuitS,a0
move.w TitleHeight,d0
move.w GadgetHeight,d1
mulu #10,d1
add.w d1,d0
add.w #MAGIC*15,d0
move.w d0,gng_TopEdge(a0)
move.w WindowWidth,d0
move.w d0,d1
lsr.w #2,d0
move.w d0,gng_Width(a0)
sub.w d0,d1
sub.w #MAGIC*2,d1
move.w d1,gng_LeftEdge(a0)
move.w GadgetHeight,gng_Height(a0)
;--------------------------------------------------------------------
; ACTION cycle
;-----------------------
lea ActionS,a0
move.w TitleHeight,d0
move.w GadgetHeight,d1
mulu #10,d1
add.w d1,d0
add.w #MAGIC*15,d0
move.w d0,gng_TopEdge(a0)
move.w GadgetHeight,gng_Height(a0)
move.w d7,d6
add.w #MAGIC*3,d6
move.w d6,gng_LeftEdge(a0)
add.w d7,d7
add.w #MAGIC*6,d7
move.w WindowWidth,d6
sub.w d7,d6
move.w d6,gng_Width(a0)
;----------------------------------------------------------------------
; setup gadgets
lea _Gad,a0
CALL CreateContext,_GadToolsBase
tst.l d0
beq.s EXIT
lea GadgetTags,a3
lea GadgetTypes,a4
lea GadgetStructs,a5
lea GadgetList,a6
GADGET_LOOP:
move.l d0,a0
beq.s EXIT
move.l (a5)+,a1
cmp.l #NULL,a1
beq.s GADGETS_DONE
move.l _TextAttr,gng_TextAttr(a1)
move.l _VisualInfo,gng_VisualInfo(a1)
move.l (a4)+,d0
move.l (a3)+,a2
move.l a6,-(a7)
CALL CreateGadgetA,_GadToolsBase
move.l (a7)+,a6
move.l d0,(a6)+
bra.s GADGET_LOOP
; open window
GADGETS_DONE:
SETTAG #NewWindowTags,WA_Gadgets,_Gad
moveq #0,d7
move.w WindowHeight,d7
SETTAG #NewWindowTags,WA_Height,d7
move.w WindowWidth,d7
SETTAG #NewWindowTags,WA_Width,d7
sub.l a0,a0
lea NewWindowTags,a1
CALL OpenWindowTagList,_IntuitionBase
move.l d0,_Window
beq.s EXIT
move.l d0,a1
move.l wd_RPort(a1),a1
move.l _Font,a0
CALL SetFont,_GfxBase
bsr.w REFRESH_WINDOW
SETTAG #FileReqTags,RT_Window,_Window
SETTAG #EZReqTags,RT_Window,_Window
;--------------------------------------------------------------------------
move.l _Window,a0
move.l wd_UserPort(a0),a0
move.l a0,_UserPort
MAINLOOP:
tst.w ExitFlag
bne.s EXIT
move.l _UserPort,a0
EXEC WaitPort
MSGLOOP:
move.l _UserPort,a0
CALL GT_GetIMsg,_GadToolsBase
move.l d0,_Message
beq.s MAINLOOP
move.l d0,a0
move.l im_Class(a0),d0
cmp.l #IDCMP_CLOSEWINDOW,d0
bne.s NO_CLOSEWINDOW
move.w #1,ExitFlag
bra.s REPLYMSG
NO_CLOSEWINDOW:
cmp.l #IDCMP_GADGETUP,d0
bne.s REPLYMSG
moveq #0,d0
move.l im_IAddress(a0),a1
move.w gg_GadgetID(a1),d0
lsl.w #2,d0
lea SubJumpTable,a2
move.l (a2,d0.w),a2
jsr (a2)
REPLYMSG:
move.l _Message,a1
CALL GT_ReplyIMsg,_GadToolsBase
bra.s MSGLOOP
EXIT: bsr.s CLEAN
movem.l (a7)+,d0-d7/a0-a6
moveq #0,d0
rts
;-----------------------------------------------------------------------------
CLEAN:
bsr.w UNLOCK_WB
bsr.s CLOSE_WINDOW
bsr.s SET_PROGDIR
bsr.s FREE_FIB
bsr.s FREE_LIST
bsr.w FREE_FILEBUFFER
bsr.w CLOSEREQ
bsr.w CLOSEGAD
bsr.w CLOSEINT
bsr.w CLOSEGFX
bsr.w CLOSEDOS
IFD WB
bsr.w REPLY_WBMSG
ENDC
rts
;------------------------------------------------------------------------
UNLOCK_WB:
tst.w WBLock
beq.s .NOT
lea WorkbenchName,a0
CALL UnlockPubScreen,_IntuitionBase
.NOT: rts
CLOSE_WINDOW:
tst.l _Window
beq.s .NOT1
move.l _Window,a0
CALL CloseWindow,_IntuitionBase
.NOT1: tst.l _Gad
beq.s .NOT2
move.l _Gad,a0
CALL FreeGadgets,_GadToolsBase
.NOT2: tst.l _Font
beq.s .NOT3
move.l _Font,a1
CALL CloseFont,_GfxBase
.NOT3: tst.l _VisualInfo
beq.s .NOT4
move.l _VisualInfo,a0
CALL FreeVisualInfo,_GadToolsBase
.NOT4: rts
;------------------------------------------------------------------------
SET_PROGDIR:
tst.w CurrentDone
beq.s .NOT1
move.l _OldCurrent,d1
CALL CurrentDir,_DOSBase
.NOT1: tst.l _CDLock
beq.s .NOT2
move.l _CDLock,d1
CALL UnLock,_DOSBase
.NOT2: rts
;------------------------------------------------------------------------
FREE_FIB:
tst.l _FIB
beq.s .NOT
moveq #DOS_FIB,d1
move.l _FIB,d2
CALL FreeDosObject,_DOSBase
move.l #0,_FIB
.NOT: rts
;------------------------------------------------------------------------
FREE_LIST:
lea ArudList,a0
TSTLIST a0
beq.s .EMPTY
.LOOP: lea ArudList,a0
TSTNODE a0,a1
beq.s .DONE
move.l a1,a2
REMOVE
move.l af_Name(a2),d3
tst.l d3
beq.s .NODE
move.l d3,a1
EXEC FreeVec ; free name
.NODE: move.l a2,a1
EXEC FreeVec ; free node
bra.s .LOOP
.DONE: lea ArudList,a0
NEWLIST a0
.EMPTY: rts
;--------------------------------------------------------------------------
CLOSEREQ:
tst.l _FileReq
beq.s .NOT1
move.l _FileReq,a1
CALL rtFreeRequest,_ReqToolsBase
.NOT1: tst.l _InfoReq
beq.s .NOT2
move.l _InfoReq,a1
CALL rtFreeRequest,_ReqToolsBase
.NOT2: tst.l _ReqToolsBase
beq.s .NOT3
CLOSELIB _ReqToolsBase
.NOT3: rts
CLOSEGAD:
tst.l _GadToolsBase
beq.s .NOT
CLOSELIB _GadToolsBase
.NOT: rts
CLOSEINT:
tst.l _IntuitionBase
beq.s .NOT
CLOSELIB _IntuitionBase
.NOT: rts
CLOSEDOS:
tst.l _DOSBase
beq.s .NOT
CLOSELIB _DOSBase
.NOT: rts
CLOSEGFX:
tst.l _GfxBase
beq.s .NOT
CLOSELIB _GfxBase
.NOT: rts
;----------------------------------------------------------------------------
IFD WB
FIND_WBMSG:
sub.l a1,a1
EXEC FindTask
move.l d0,a4
moveq #0,d0
tst.l pr_CLI(a4)
bne.s .CLI
lea pr_MsgPort(a4),a0
EXEC WaitPort
lea pr_MsgPort(a4),a0
EXEC GetMsg
.CLI: move.l d0,_WBMsg
rts
REPLY_WBMSG:
tst.l _WBMsg
beq.s .NOT
EXEC Forbid
move.l _WBMsg,a1
EXEC ReplyMsg
EXEC Permit
.NOT: rts
ENDC
;-----------------------------------------------------------------------------
GET_FONT_DATA:
move.l a0,_TextAttr
CALL OpenFont,_GfxBase
move.l d0,_Font
beq.s .EXIT
move.l d0,a0
move.w tf_YSize(a0),FontHeight
move.w tf_XSize(a0),FontWidth
move.w FontHeight,d0
add.w #MAGIC*2,d0
move.w d0,GadgetHeight
moveq #1,d0
.EXIT: rts
;-------------------------------------------------------------------------
REFRESH_WINDOW:
move.l _Window,a0
sub.l a1,a1
CALL GT_RefreshWindow,_GadToolsBase
bsr.w RENDER_BEVELBOXES
rts
RENDER_BEVELBOXES:
move.l _Window,a0
move.l wd_RPort(a0),a0
lea BevelTags,a1
moveq #MAGIC,d0
move.w TitleHeight,d1
add.w GadgetHeight,d1
add.w #MAGIC*2,d1
move.w WindowWidth,d2
sub.w #MAGIC*2,d2
move.w GadgetHeight,d3
lsl.w #2,d3
add.w #MAGIC*5,d3
add.w #MAGIC/2,d3
move.w d3,d4
add.w d1,d4
CALL DrawBevelBoxA,_GadToolsBase
move.l _Window,a0
move.l wd_RPort(a0),a0
lea BevelTags,a1
moveq #MAGIC,d0
move.w d4,d1
addq.w #1,d1
move.w WindowWidth,d2
sub.w #MAGIC*2,d2
move.w GadgetHeight,d3
mulu #3,d3
add.w #MAGIC*5,d3
sub.w #MAGIC/2,d3
CALL DrawBevelBoxA,_GadToolsBase
rts
;-----------------------------------------------------------------------------
NO_OP: rts
;-----------------------------------------------------------------------------
PATH_BUTTON:
bsr.w ALL_GADS_OFF
move.l _FileReq,a1
sub.l a2,a2
lea ArudTitle,a3
lea FileReqTags,a0
CALL rtFileRequestA,_ReqToolsBase
tst.l d0
beq.s NO_PATHB
move.l _FileReq,a0
move.l rtfi_Dir(a0),a0 ; copy result to buffer
lea PathString,a1
move.w #PATHLEN-1,d7
.LOOP: move.b (a0)+,(a1)+
beq.s .DONE
dbf d7,.LOOP
.DONE: moveq #GAD_PSTRING,d0 ; put pathname in string-gadget
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea PStringTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
move.l #PathString,d7
bsr.s CURRENT_DIRECTORY
bsr.w BUILD_STRUCTURE
beq.s NO_PATHB
moveq #GAD_BASETEXT,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea BaseTextTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
move.l NoFiles,d7
SETTAG #NoFilesTags,GTNM_Number,d7
moveq #GAD_NOFILES,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea NoFilesTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
SETTAG #ReqPlaceTags,GTNM_Number,ReqPlaceLow
moveq #GAD_REQPLACE,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea ReqPlaceTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
SETTAG #PlaceUseTags,GTNM_Number,PlacesUsed
moveq #GAD_PLACEUSE,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea PlaceUseTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
moveq #GAD_RANGE,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea RangeTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
NO_PATHB:
bsr.w ALL_GADS_ON
rts
;------------------------------------------------------------------------
PATH_STRING:
move.l gg_SpecialInfo(a1),a2
move.l si_Buffer(a2),d7
bsr.s CURRENT_DIRECTORY
beq.s PS_FAIL
move.l d7,a0
lea PathString,a1
move.w #PATHLEN-1,d7
.LOOP: move.b (a0)+,(a1)+
beq.s .DONE
dbf d7,.LOOP
.DONE: move.l _FileReq,a1
lea ChangeDirTags,a0
CALL rtChangeReqAttrA,_ReqToolsBase
MAIN_BSTRUCT:
bsr.w ALL_GADS_OFF
bsr.w BUILD_STRUCTURE
beq.s PS_FAIL
moveq #GAD_BASETEXT,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea BaseTextTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
move.l NoFiles,d7
SETTAG #NoFilesTags,GTNM_Number,d7
moveq #GAD_NOFILES,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea NoFilesTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
SETTAG #ReqPlaceTags,GTNM_Number,ReqPlaceLow
moveq #GAD_REQPLACE,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea ReqPlaceTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
SETTAG #PlaceUseTags,GTNM_Number,PlacesUsed
moveq #GAD_PLACEUSE,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea PlaceUseTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
moveq #GAD_RANGE,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea RangeTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
bsr.w ALL_GADS_ON
rts
PS_FAIL:
moveq #GAD_PSTRING,d0 ; put pathname in string-gadget
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l a0,a4
move.l _Window,a1
sub.l a2,a2
lea PStringTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
SETTAG #NoFilesTags,GTNM_Number,#0
moveq #GAD_NOFILES,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea NoFilesTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
bsr.w ALL_GADS_ON
move.l a4,a0
move.l _Window,a1
sub.l a2,a2
CALL ActivateGadget,_IntuitionBase
rts
;---------------------------------------------------------------------------
NEWBASE_STRING:
move.l gg_SpecialInfo(a1),a2
move.l si_Buffer(a2),a2
move.l a2,a3
.ILL: move.b (a3)+,d0
beq.s .DONE
lea IllegalChars,a4 ; check for illegal chars
.LOOP: move.b (a4)+,d1
beq.s .ILL
cmp.b d0,d1
bne.s .LOOP
move.l _WBScr,a0
CALL DisplayBeep,_IntuitionBase
moveq #GAD_NEWBASE,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l a0,a4
move.l _Window,a1
sub.l a2,a2
lea ChangeStrTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
move.l a4,a0
move.l _Window,a1
sub.l a2,a2
CALL ActivateGadget,_IntuitionBase
rts
.DONE: lea BaseString,a3
.LOOP2: move.b (a2)+,(a3)+
bne.s .LOOP2
tst.l PreDefBase
beq.s .NOT
lea BaseString,a0
lea FileBase,a1
move.w #-1,d7
.LOOP3: addq.w #1,d7
move.b (a0)+,(a1)+
bne.s .LOOP3
move.w d7,PreBaseLen
.NOT: rts
;-------------------------------------------------------------------------
PLACES_INTEGER:
move.l gg_SpecialInfo(a1),a2
move.l si_LongInt(a2),d7
ble.s .NULL
cmp.l #PLACESLEN,d7
ble.s OK_INTP
.NULL: move.l _WBScr,a0
CALL DisplayBeep,_IntuitionBase
move.l PlacesValue,d7
SETTAG #ChangeIntTags,GTIN_Number,d7
moveq #GAD_PLACES,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l a0,a4
move.l _Window,a1
sub.l a2,a2
lea ChangeIntTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
move.l a4,a0
move.l _Window,a1
sub.l a2,a2
CALL ActivateGadget,_IntuitionBase
OK_INTP:
move.l d7,PlacesValue
rts
;-----------------------------------------------------------------------------
START_INTEGER:
move.l gg_SpecialInfo(a1),a2
move.l si_LongInt(a2),d7
bge.s OK_INTS
move.l _WBScr,a0
CALL DisplayBeep,_IntuitionBase
move.l StartValue,d7
SETTAG #ChangeIntTags,GTIN_Number,d7
moveq #GAD_PLACES,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l a0,a4
move.l _Window,a1
sub.l a2,a2
lea ChangeIntTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
move.l a4,a0
move.l _Window,a1
sub.l a2,a2
CALL ActivateGadget,_IntuitionBase
OK_INTS:
move.l d7,StartValue
rts
;-----------------------------------------------------------------------------
LEADING_CYCLE:
move.w im_Code(a0),UseLeading
rts
;-----------------------------------------------------------------------------
CONVERT_BUTTON:
bsr.w ALL_GADS_OFF
move.l _Window,a0
lea ArudWorking,a1
lea ArudScrTitle,a2
CALL SetWindowTitles,_IntuitionBase
lea ArudList,a0
TSTLIST a0
beq.s NOC_LIST
lea BaseString,a0
tst.b (a0)
beq.s NOC_BASE
move.l ReqPlaceLow,d0
move.l PlacesValue,d1
cmp.l d1,d0
bgt.s NOC_PLACES
move.l StartValue,d7
add.l NoFiles,d7
lea DummyString,a2
bsr.w NUM2TXT
move.l d6,ReqPlaceNew ; required places!!!
move.l PlacesValue,d1
cmp.l d1,d6
bgt.s NOC_PLACES
;--------------------------------------------------------------------
lea ArudList,a0
CONVERT_LOOP:
TSTNODE a0,a1
beq.s CONVERT_DONE
;--------------------------------------------------------------------
tst.w ReverseFlag
bne.s .REVERSE
move.l af_Count(a1),d0
sub.l SmallestNo,d0
add.l StartValue,d0 ; new count for this number.
bra.s .NEWVAL
.REVERSE: ; reverse renaming
move.l af_Count(a1),d0
move.l StartValue,d1
add.l NoFiles,d1
subq.l #1,d1 ; highest value
move.l SmallestNo,d2
sub.l d0,d2
add.l d1,d2
move.l d2,d0
;--------------------------------------------------------------------
.NEWVAL:
lea BaseString,a2
lea Filename,a3
.COPY: move.b (a2)+,(a3)+
bne.s .COPY
lea -1(a3),a3
lea DummyString,a4
move.l PlacesValue,d7
move.b #0,(a4,d7.w)
subq.w #1,d7
.NUMTXT:
divu #10,d0
swap d0
add.b #'0',d0
move.b d0,(a4,d7.w)
clr.w d0
swap d0
dbf d7,.NUMTXT
;--------------------------------------------------------------------
tst.w UseLeading
bne.s .COPY2
.SEEK: cmp.b #'0',(a4)
bne.s .ZERO
lea 1(a4),a4
bra.s .SEEK
.ZERO: tst.b (a4)
bne.s .COPY2
lea -1(a4),a4
.COPY2: move.b (a4)+,(a3)+
bne.s .COPY2
;--------------------------------------------------------------------
move.l af_Name(a1),d1
move.l #Filename,d2
movem.l a0/a1,-(a7)
tst.w ActionFlag ; rename or copy files?
bne.s COPY_FILE
RENAME_FILE:
CALL Rename,_DOSBase
bra.s ACTION_DONE
COPY_FILE:
bsr.w ACTION_COPY_FILE
ACTION_DONE:
movem.l (a7)+,a0/a1
tst.l d0
beq.s RENAME_ERROR
;--------------------------------------------------------------------
move.l af_Name(a1),a2
move.l a2,d1
.SRCH: tst.b (a2)+
bne.s .SRCH
lea -1(a2),a2
lea InfoString,a3
.COPY3: move.b (a3)+,(a2)+
bne.s .COPY3
movem.l a0/a1,-(a7)
move.l #ACCESS_READ,d2
CALL Lock,_DOSBase
tst.l d0
bne.s .UNL
movem.l (a7)+,a0/a1
bra.s CONTINUE
.UNL: move.l d0,d1
CALL UnLock,_DOSBase
movem.l (a7)+,a0/a1
;--------------------------------------------------------------------
lea Filename,a2
.SRCH2: tst.b (a2)+
bne.s .SRCH2
lea -1(a2),a2
lea InfoString,a3
.COPY4: move.b (a3)+,(a2)+
bne.s .COPY4
;--------------------------------------------------------------------
move.l af_Name(a1),d1
move.l #Filename,d2
movem.l a0/a1,-(a7)
tst.w ActionFlag ; rename or copy files?
bne.s COPY_INFO
RENAME_INFO:
CALL Rename,_DOSBase
bra.s ACTION_DONE2
COPY_INFO:
bsr.w ACTION_COPY_FILE
ACTION_DONE2:
movem.l (a7)+,a0/a1
tst.l d0
beq.s RENAME_ERROR
CONTINUE:
move.l a1,a0
bra.s CONVERT_LOOP
;--------------------------------------------------------------------
CONVERT_DONE:
move.l _Window,a0
lea ArudTitle,a1
lea ArudScrTitle,a2
CALL SetWindowTitles,_IntuitionBase
bsr.w ALL_GADS_ON
rts
;--------------------------------------------------------------------
ACTION_COPY_FILE:
move.l d1,d6 ; from
move.l d2,d7 ; to
bsr.w FREE_FIB
moveq #DOS_FIB,d1
moveq #0,d2
CALL AllocDosObject,_DOSBase
move.l d0,_FIB
beq.s COPY_FAIL
move.l d6,d1
move.l #MODE_OLDFILE,d2
CALL Open,_DOSBase
move.l d0,_CopyFile
beq.s COPY_FAIL
move.l d0,d1
move.l _FIB,d2
CALL ExamineFH,_DOSBase
move.l _FIB,a0
move.l fib_Size(a0),d4
addq.l #1,d4
move.l d4,d0
move.l #MEMF_ANY,d1
EXEC AllocVec
move.l d0,_FileBuffer
beq.s COPY_FAIL
subq.l #1,d4
move.l _CopyFile,d1
move.l _FileBuffer,d2
move.l d4,d3
CALL Read,_DOSBase
cmp.l d0,d4
bne.s COPY_FAIL
bsr.s FREE_COPYFILE
cmp.w #2,ActionFlag ; Copy to?
bne.s .NOT
move.l CPathStart,a0
move.l #Filename,a1
.CPY: move.b (a1)+,(a0)+
bne.s .CPY
move.l #CopyToPath,d7
.NOT: move.l d7,d1
move.l #MODE_NEWFILE,d2
CALL Open,_DOSBase
move.l d0,_CopyFile
beq.s COPY_FAIL
move.l d0,d1
move.l _FileBuffer,d2
move.l d4,d3
CALL Write,_DOSBase
bsr.w FREE_COPYFILE
bsr.w FREE_FILEBUFFER
moveq #1,d0
rts
COPY_FAIL:
bsr.w FREE_COPYFILE
bsr.w FREE_FILEBUFFER
moveq #0,d0
rts
;--------------------------------------------------------------------
FREE_COPYFILE:
tst.l _CopyFile
beq.s .NOT
move.l _CopyFile,d1
CALL Close,_DOSBase
move.l #0,_CopyFile
.NOT: rts
FREE_FILEBUFFER:
tst.l _FileBuffer
beq.s .NOT
move.l _FileBuffer,a1
EXEC FreeVec
move.l #0,_FileBuffer
.NOT: rts
;--------------------------------------------------------------------
RENAME_ERROR:
CALL IoErr,_DOSBase
cmp.l #ERROR_OBJECT_IN_USE,d0
beq.s NOC_INUSE
cmp.l #ERROR_OBJECT_EXISTS,d0
beq.s NOC_EXISTS
cmp.l #ERROR_OBJECT_NOT_FOUND,d0
beq.s NOC_NOTFOUND
lea ERRRename,a1
bsr.s DISPLAY_REQUESTER
rts
;--------------------------------------------------------------------
NOC_INUSE:
lea ERRInUse,a1
bsr.s DISPLAY_REQUESTER
rts
NOC_EXISTS:
lea ERRExists,a1
bsr.s DISPLAY_REQUESTER
rts
NOC_NOTFOUND:
lea ERRNotFound,a1
bsr.s DISPLAY_REQUESTER
rts
;--------------------------------------------------------------------
NOC_BASE:
lea ERRNoBase,a1
bsr.s DISPLAY_REQUESTER
rts
NOC_LIST:
lea ERRNoList,a1
bsr.s DISPLAY_REQUESTER
rts
NOC_PLACES:
lea ERRCheckPlaces,a1
bsr.s DISPLAY_REQUESTER
rts
DISPLAY_REQUESTER:
move.l a1,-(a7)
move.l _Window,a0
lea ArudTitle,a1
sub.l a2,a2
CALL SetWindowTitles,_IntuitionBase
move.l (a7)+,a1
lea GADText_Ok,a2
move.l _InfoReq,a3
sub.l a4,a4
lea EZReqTags,a0
CALL rtEZRequestA,_ReqToolsBase
bsr.w ALL_GADS_ON
rts
;-----------------------------------------------------------------------------
QUIT_BUTTON:
move.w #1,ExitFlag
rts
;-----------------------------------------------------------------------------
FORCE_CYCLE:
moveq #0,d0
move.w im_Code(a0),d0
move.l d0,PreDefBase
beq.s PREDEF_OFF
lea BaseString,a0
tst.b (a0)
beq.s PREDEF_NOSTRING
lea FileBase,a1
move.w #-1,d7
.LOOP: addq.w #1,d7
move.b (a0)+,(a1)+
bne.s .LOOP
move.w d7,PreBaseLen
rts
PREDEF_OFF:
lea FileBase,a0
move.b #0,(a0)
rts
PREDEF_NOSTRING:
clr.l PreDefBase
lea FileBase,a0
move.b #0,(a0)
move.l _WBScr,a0
CALL DisplayBeep,_IntuitionBase
moveq #GAD_FORCE,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l a0,a4
move.l _Window,a1
sub.l a2,a2
lea ForceTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
rts
;-------------------------------------------------------------------
DIRECT_CYCLE:
move.w im_Code(a0),ReverseFlag
rts
;--------------------------------------------------------------------
ACTION_CYCLE:
move.w im_Code(a0),ActionFlag
cmp.w #2,ActionFlag
bne.s SAME_PATH
bsr.w ALL_GADS_OFF
move.l _FileReq,a1
sub.l a2,a2
lea ArudTitle,a3
lea FileReqTags,a0
CALL rtFileRequestA,_ReqToolsBase
tst.l d0
beq.s SET_ACT_RENAME
move.l _FileReq,a0
move.l rtfi_Dir(a0),a0 ; copy result to buffer
lea CopyToPath,a1
.LOOP: move.b (a0)+,(a1)+
bne.s .LOOP
lea -1(a1),a1
move.l a1,CPathStart ; this is where the filename
; starts
cmp.b #':',-1(a1)
beq.s NO_ACT_PATH
cmp.b #'/',-1(a1)
beq.s NO_ACT_PATH
move.b #'/',(a1)+
move.l a1,CPathStart
NO_ACT_PATH:
bsr.w ALL_GADS_ON
rts
SET_ACT_RENAME:
SETTAG #ActionTags,GTCY_Active,#0
moveq #GAD_ACTION,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l a0,a4
move.l _Window,a1
sub.l a2,a2
lea ActionTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
move.w #0,ActionFlag
bsr.w ALL_GADS_ON
rts
SAME_PATH:
move.l #0,CPathStart
rts
;--------------------------------------------------------------------
CURRENT_DIRECTORY: ; d7=pathname
tst.l _CDLock
beq.s .LOCK
move.l _CDLock,d1
CALL UnLock,_DOSBase
move.l #0,_CDLock
.LOCK: move.l d7,d1
move.l #ACCESS_READ,d2
CALL Lock,_DOSBase
move.l d0,_CDLock
bne.s .OKLOCK
move.l _WBScr,a0
CALL DisplayBeep,_IntuitionBase
moveq #0,d0
rts
.OKLOCK:
move.l d0,d1
CALL CurrentDir,_DOSBase
tst.w CurrentDone
bne.s .PRGCD
move.l d0,_OldCurrent
move.w #1,CurrentDone
.PRGCD: moveq #1,d0
rts
;-----------------------------------------------------------------------------
BUILD_STRUCTURE:
bsr.w FREE_LIST
bsr.w FREE_FIB
move.w #0,HasStructure
move.l #$fffffff,SmallestNo
move.l #0,HighestNo
move.l #0,NoFiles
move.l #0,PlacesUsed
bsr.w RESET_GADGETS
moveq #GAD_FORCE,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea ForceAttrTags,a3
CALL GT_GetGadgetAttrsA,_GadToolsBase
moveq #DOS_FIB,d1
moveq #0,d2
CALL AllocDosObject,_DOSBase
move.l d0,_FIB
beq.s BUILD_FAIL
move.l _CDLock,d1
move.l _FIB,d2
CALL Examine,_DOSBase
beq.s BUILD_FAIL
BUILD_LOOP:
move.l _CDLock,d1
move.l _FIB,d2
CALL ExNext,_DOSBase
tst.l d0
beq.s CHECK_END
move.l _FIB,a0
tst.l fib_DirEntryType(a0) ; files only
bpl.s BUILD_LOOP
lea fib_FileName(a0),a2
tst.l PreDefBase
bne.s BASE_PREDEF
bsr.s CHECK_NAME ; check for illegal filename
beq.s BUILD_LOOP
BASE_PREDEF:
move.l a2,a3
lea FileBase,a4 ; files must have same basename!!
.SAME: move.b (a4)+,d0
beq.s .SOK
move.b (a3)+,d1
cmp.b d0,d1
beq.s .SAME
bra.s BUILD_LOOP
.SOK: tst.b (a3) ; filename has same base
beq.s BUILD_LOOP
moveq #0,d2
.CHK2: move.b (a3)+,d0 ; ... now check if next part is a
beq.s .USE ; number...
cmp.b #'0',d0
blo.s BUILD_LOOP
cmp.b #'9',d0
bhi.s BUILD_LOOP
addq.l #1,d2
bra.s .CHK2
.USE: move.l d2,PlacesUsed ; max number of places used
move.l #af_SIZEOF,d0
move.l #MEMF_ANY!MEMF_CLEAR,d1
EXEC AllocVec
move.l d0,_CurrentNode
beq.s BUILD_FAIL
move.l #FILELEN+1,d0
move.l #MEMF_ANY!MEMF_CLEAR,d1
EXEC AllocVec
tst.l d0
beq.s BUILD_FAIL
move.l _CurrentNode,a1
move.l d0,af_Name(a1) ; insert filenameptr into node
move.l d0,a0
move.w #FILELEN-1,d7 ; copy text
move.l a2,a3
COPY_NAME:
move.b (a2)+,(a0)+
beq.s .DONE
dbf d7,COPY_NAME
.DONE: move.w PreBaseLen,d7
lea (a3,d7.w),a3 ; jump to number-part of string
MAKE_NUMBER:
moveq #0,d0
moveq #0,d1
.MAKE: move.b (a3)+,d1
beq.s .DONE
sub.b #'0',d1
mulu #10,d0
add.w d1,d0
bra.s .MAKE
.DONE: move.l d0,af_Count(a1)
move.l HighestNo,d1
cmp.l d1,d0
blt.s .LOW
move.l d0,HighestNo
.LOW: move.l SmallestNo,d1
cmp.l d1,d0
bgt.s .BIG
move.l d0,SmallestNo
.BIG: lea ArudList,a0
move.l _CurrentNode,a1 ; insert node into list
ADDTAIL
add.l #1,NoFiles
bra.s BUILD_LOOP
BUILD_FAIL:
move.l #0,_CurrentNode
moveq #0,d0
rts
CHECK_END:
CALL IoErr,_DOSBase
cmp.l #ERROR_NO_MORE_ENTRIES,d0
bne.s BUILD_FAIL
lea ArudList,a0
TSTLIST a0
beq.s BUILD_FAIL
; make range-text
move.l SmallestNo,d7 ; smallest in range
lea RangeString,a2
bsr.w NUM2TXT
move.b #'-',-1(a2)
move.l SmallestNo,d7
add.l NoFiles,d7
subq.l #1,d7 ; d7=largest in range
bsr.w NUM2TXT
move.b #0,-1(a2)
move.l NoFiles,d7
lea DummyString,a2
bsr.w NUM2TXT
move.l d6,ReqPlaceLow ; required places!!!
move.w #1,HasStructure
moveq #1,d0
rts
;-----------------------------------------------------------------------------
NUM2TXT: ; d7=number, a2=string to fill
move.l d7,d0
lea DummyStringE,a0
lea DummyString,a1
move.w #9,d1
.CLR: clr.b (a1)+
dbf d1,.CLR
moveq #0,d6
.LOOP: addq.l #1,d6
divu #10,d0
swap d0
add.b #'0',d0
move.b d0,-(a0)
clr.w d0
swap d0
tst.w d0
bne.s .LOOP
move.b #0,-(a0)
lea DummyString,a1
.SEEK: tst.b (a1)+
beq.s .SEEK
lea -1(a1),a1
.COPY: move.b (a1)+,(a2)+
bne.s .COPY
rts ; d6=places in string used
;-----------------------------------------------------------------------------
CHECK_NAME: ; only names that end in a number are legal
move.l a2,a3
.NULL: tst.b (a3)+
bne.s .NULL
lea -1(a3),a3
.CHK: lea -1(a3),a3
cmp.b #' ',(a3)
beq.s .CHK
cmp.b #'0',(a3)
blo.s .FAIL
cmp.b #'9',(a3)
bhi.s .FAIL
.BASE: lea -1(a3),a3 ; find last char of basename
cmp.b #'0',(a3)
blo.s .FOUND
cmp.b #'9',(a3)
ble.s .BASE
.FOUND: lea 1(a3),a3
move.l a2,a4
lea FileBase,a5
moveq #0,d7 ; length of basename
.CPY: move.b (a4)+,(a5)+
addq.w #1,d7
cmp.l a3,a4
bne.s .CPY
move.b #0,(a5)
cmp.w #BASELEN,d7 ; too many chars used in basename
bgt.s .FAIL
move.w d7,PreBaseLen ; length of pre-defined basename length
move.l #1,PreDefBase
moveq #1,d0
rts
.FAIL: moveq #0,d0
rts
;-----------------------------------------------------------------------------
RESET_GADGETS:
moveq #GAD_BASETEXT,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea ClrBTextTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
SETTAG #ReqPlaceTags,GTNM_Number,#0
moveq #GAD_REQPLACE,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea ReqPlaceTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
SETTAG #PlaceUseTags,GTNM_Number,#0
moveq #GAD_PLACEUSE,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea PlaceUseTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
SETTAG #NoFilesTags,GTNM_Number,#0
moveq #GAD_NOFILES,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea NoFilesTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
lea RangeString,a0
move.b #0,(a0)
moveq #GAD_RANGE,d0
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea RangeTags,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
rts
;-----------------------------------------------------------------------------
ALL_GADS_ON:
lea AllGads,a5
.LOOP: move.l (a5)+,d0
bmi.s .DONE
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea AllOnTag,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
bra.s .LOOP
.DONE: rts
ALL_GADS_OFF:
lea AllGads,a5
.LOOP: move.l (a5)+,d0
bmi.s .DONE
lsl.w #2,d0
lea GadgetList,a0
move.l (a0,d0.w),a0
move.l _Window,a1
sub.l a2,a2
lea AllOffTag,a3
CALL GT_SetGadgetAttrsA,_GadToolsBase
bra.s .LOOP
.DONE: rts
;-----------------------------------------------------------------------------
section "Data",data
IFD WB
_WBMsg: dc.l 0
ENDC
_DOSBase: dc.l 0
_GfxBase: dc.l 0
_GadToolsBase: dc.l 0
_IntuitionBase: dc.l 0
_ReqToolsBase: dc.l 0
ReqToolsName: dc.b "reqtools.library",0
IntuitionName: dc.b "intuition.library",0
GadToolsName: dc.b "gadtools.library",0
DOSName: dc.b "dos.library",0
GfxName: dc.b "graphics.library",0
VERSTR
ProgramName: dc.b "Arud Converter V"
VER
dc.b "."
REV
dc.b 0
even
;----------------------------------------------------------------------------
WBLock: dc.w 0
ExitFlag: dc.w 0
_UserPort: dc.l 0
_Message: dc.l 0
_FileReq: dc.l 0
_InfoReq: dc.l 0
;----------------------------------------------------------------------------
SubJumpTable: dc.l PATH_BUTTON
dc.l PATH_STRING
dc.l NO_OP
dc.l NO_OP
dc.l NO_OP
dc.l NO_OP
dc.l NEWBASE_STRING
dc.l PLACES_INTEGER
dc.l START_INTEGER
dc.l LEADING_CYCLE
dc.l CONVERT_BUTTON
dc.l QUIT_BUTTON
dc.l FORCE_CYCLE
dc.l DIRECT_CYCLE
dc.l ACTION_CYCLE
dc.l NO_OP
;----------------------------------------------------------------------------
HasStructure: dc.w 0
_CurrentNode: dc.l 0
ArudList: dcb.b MLH_SIZE,0
;----------------------------------------------------------------------------
CurrentDone: dc.w 0 ; has CurrentDir() ever
; been done?
_OldCurrent: dc.l 0
_CDLock: dc.l 0 ; lock to chosen path
_FIB: dc.l 0
UseLeading: dc.w 0 ; use leading zeros
PlacesValue: dc.l 1 ; number of places
StartValue: dc.l 0 ; new start value
HighestNo: dc.l 0
SmallestNo: dc.l $fffffff ; smallest number
NoFiles: dc.l 0 ; number of files found
ReqPlaceLow: dc.l 0
ReqPlaceNew: dc.l 0 ; required places
PlacesUsed: dc.l 0
PreBaseLen: dc.w 0 ; pre-def basename length
PreDefBase: dc.l 0 ; is basename pre-defined?
ReverseFlag: dc.w 0 ; order of renaming (reverse)
ActionFlag: dc.w 0 ; Rename() or Copy() files
_CopyFile: dc.l 0
_FileBuffer: dc.l 0
CPathStart: dc.l 0
IllegalChars: dc.b ":;*/?'#%",0 ; cannot be used in basename
PathString: dcb.b PATHLEN+1,0
BaseString: dcb.b BASELEN+1,0 ; user defined
FileBase: dcb.b BASELEN+1,0 ; set by 'BUILD_STRUCTURE'
RangeString: dcb.b 18,0 ; Range of files
Filename: dcb.b 108,0
CopyToPath: dcb.b 108,0
DummyString: dcb.b PLACESLEN+1,0 ; dummy string for converting
DummyStringE: dc.b 0 ; numbers to decimal text
InfoString: dc.b ".info",0
ERRNoBase: dc.b "No basestring defined.",0
ERRNoList: dc.b "No filelist defined.",0
ERRCheckPlaces: dc.b "Places value too low.",0
ERRRename: dc.b "Copy/Rename error.",0
ERRInUse: dc.b "File is in use.",0
ERRExists: dc.b "File already exists.",0
ERRNotFound: dc.b "File not found! Update filelist.",0
GADText_Ok: dc.b "Ok",0
even
FileReqTags: dc.l RT_ReqPos,REQPOS_CENTERWIN
dc.l RT_Window,0
dc.l RTFI_Flags,FREQF_NOFILES
dc.l RTEZ_ReqTitle,ProgramName
dc.l TAG_DONE
EZReqTags: dc.l RT_ReqPos,REQPOS_CENTERWIN
dc.l RT_Window,0
dc.l RTEZ_ReqTitle,ProgramName
dc.l TAG_DONE
ChangeDirTags: dc.l RTFI_Dir,PathString
dc.l TAG_DONE
ChangeIntTags: dc.l GTIN_Number,0
dc.l TAG_DONE
ChangeStrTags: dc.l GTST_String,BaseString
dc.l TAG_DONE
ForceAttrTags: dc.l GTCY_Active,PreDefBase
dc.l TAG_DONE
ClrBTextTags: dc.l GTTX_Text,NULL
dc.l TAG_DONE
;----------------------------------------------------------------------------
_TextAttr: dc.l 0
_Font: dc.l 0
_VisualInfo: dc.l 0
_WBScr: dc.l 0
WorkbenchName: dc.b "Workbench",0
even
FontHeight: dc.w 0
FontWidth: dc.w 0
TitleHeight: dc.w 0
WindowHeight: dc.w 0
WindowWidth: dc.w 0
GadgetHeight: dc.w 0
_Gad: dc.l 0
GadgetList: dcb.l SUMGAD,0
AllGads: dc.l GAD_PBUTTON,GAD_PSTRING,GAD_NEWBASE,GAD_PLACES
dc.l GAD_STARTVAL,GAD_LEADING,GAD_CONVERT,GAD_QUIT
dc.l GAD_FORCE,GAD_DIRECTION,GAD_ACTION,-1
AllOnTag: dc.l GA_Disabled,FALSE
dc.l TAG_DONE
AllOffTag: dc.l GA_Disabled,TRUE
dc.l TAG_DONE
GadgetTags: dc.l PButtonTags
dc.l PStringTags
dc.l BaseTextTags
dc.l ReqPlaceTags
dc.l NoFilesTags
dc.l RangeTags
dc.l NewBaseTags
dc.l PlacesTags
dc.l StartValTags
dc.l LeadingTags
dc.l ConvertTags
dc.l QuitTags
dc.l ForceTags
dc.l DirectionTags
dc.l ActionTags
dc.l PlaceUseTags
dc.l 0
PButtonTags: dc.l TAG_DONE
PStringTags: dc.l GTST_String,PathString
dc.l GTST_MaxChars,PATHLEN
dc.l GA_TabCycle,FALSE
dc.l TAG_DONE
BaseTextTags: dc.l GTTX_Border,TRUE
dc.l GTTX_Text,FileBase
dc.l TAG_DONE
ReqPlaceTags: dc.l GTNM_Number,0
dc.l GTNM_Border,TRUE
dc.l TAG_DONE
NoFilesTags: dc.l GTNM_Number,0
dc.l GTNM_Border,TRUE
dc.l TAG_DONE
RangeTags: dc.l GTTX_Text,RangeString
dc.l GTTX_Border,TRUE
dc.l TAG_DONE
NewBaseTags: dc.l GTST_MaxChars,BASELEN
dc.l GA_TabCycle,TRUE
dc.l TAG_DONE
PlacesTags: dc.l GTIN_MaxChars,2
dc.l GA_TabCycle,TRUE
dc.l GTIN_Number,1
dc.l TAG_DONE
StartValTags: dc.l GTIN_MaxChars,8
dc.l GA_TabCycle,TRUE
dc.l TAG_DONE
LeadingTags: dc.l GTCY_Labels,LeadingPtrs
dc.l TAG_DONE
ConvertTags: dc.l TAG_DONE
QuitTags: dc.l TAG_DONE
ForceTags: dc.l GTCY_Active,0
dc.l GTCY_Labels,ForcePtrs
DirectionTags: dc.l GTCY_Labels,DirectionPtrs
dc.l TAG_DONE
ActionTags: dc.l GTCY_Active,0
dc.l GTCY_Labels,ActionPtrs
dc.l TAG_DONE
PlaceUseTags: dc.l GTNM_Number,0
dc.l GTNM_Border,TRUE
dc.l TAG_DONE
GadgetTypes: dc.l BUTTON_KIND
dc.l STRING_KIND
dc.l TEXT_KIND
dc.l NUMBER_KIND
dc.l NUMBER_KIND
dc.l TEXT_KIND
dc.l STRING_KIND
dc.l INTEGER_KIND
dc.l INTEGER_KIND
dc.l CYCLE_KIND
dc.l BUTTON_KIND
dc.l BUTTON_KIND
dc.l CYCLE_KIND
dc.l CYCLE_KIND
dc.l CYCLE_KIND
dc.l NUMBER_KIND
GadgetStructs: dc.l PButtonS
dc.l PStringS
dc.l BaseTextS
dc.l ReqPlaceS
dc.l NoFilesS
dc.l RangeS
dc.l NewBaseS
dc.l PlacesS
dc.l StartValS
dc.l LeadingS
dc.l ConvertS
dc.l QuitS
dc.l ForceS
dc.l DirectionS
dc.l ActionS
dc.l PlaceUseS
dc.l 0
PButtonS: dc.w 0 ; gng_LeftEdge
dc.w 0 ; gng_TopEdge
dc.w 0 ; gng_Width
dc.w 0 ; gng_Height
dc.l PathText ; gng_GadgetText
dc.l 0 ; gng_TextAttr
dc.w GAD_PBUTTON ; gng_GadgetID
dc.l PLACETEXT_IN ; gng_Flags
dc.l 0 ; gng_VisualInfo
dc.l 0 ; gng_UserData
PathText: dc.b "Path",0
even
PStringS: dc.w 0 ; gng_LeftEdge
dc.w 0 ; gng_TopEdge
dc.w 0 ; gng_Width
dc.w 0 ; gng_Height
dc.l 0 ; gng_GadgetText
dc.l 0 ; gng_TextAttr
dc.w GAD_PSTRING ; gng_GadgetID
dc.l 0 ; gng_Flags
dc.l 0 ; gng_VisualInfo
dc.l 0 ; gng_UserData
PCalcIT: dc.b 0,0
dc.b 0,0
dc.w 0,0
dc.l 0
dc.l PCalcString
dc.l 0
PCalcString: dcb.b PCALCLEN,"a"
dc.b 0
even
BaseTextS: dc.w 0 ; gng_LeftEdge
dc.w 0 ; gng_TopEdge
dc.w 0 ; gng_Width
dc.w 0 ; gng_Height
dc.l BaseTextText ; gng_GadgetText
dc.l 0 ; gng_TextAttr
dc.w GAD_BASETEXT ; gng_GadgetID
dc.l PLACETEXT_LEFT ; gng_Flags
dc.l 0 ; gng_VisualInfo
dc.l 0 ; gng_UserData
BaseTextText: dc.b "Basename",0
even
ReqPlaceS: dc.w 0 ; gng_LeftEdge
dc.w 0 ; gng_TopEdge
dc.w 0 ; gng_Width
dc.w 0 ; gng_Height
dc.l ReqPlaceText ; gng_GadgetText
dc.l 0 ; gng_TextAttr
dc.w GAD_REQPLACE ; gng_GadgetID
dc.l PLACETEXT_LEFT ; gng_Flags
dc.l 0 ; gng_VisualInfo
dc.l 0 ; gng_UserData
ReqPlaceText: dc.b "Places needed",0
even
NoFilesS: dc.w 0 ; gng_LeftEdge
dc.w 0 ; gng_TopEdge
dc.w 0 ; gng_Width
dc.w 0 ; gng_Height
dc.l NoFilesText ; gng_GadgetText
dc.l 0 ; gng_TextAttr
dc.w GAD_NOFILES ; gng_GadgetID
dc.l PLACETEXT_LEFT ; gng_Flags
dc.l 0 ; gng_VisualInfo
dc.l 0 ; gng_UserData
NoFilesText: dc.b "Files",0
even
RangeS: dc.w 0 ; gng_LeftEdge
dc.w 0 ; gng_TopEdge
dc.w 0 ; gng_Width
dc.w 0 ; gng_Height
dc.l RangeText ; gng_GadgetText
dc.l 0 ; gng_TextAttr
dc.w GAD_RANGE ; gng_GadgetID
dc.l PLACETEXT_LEFT ; gng_Flags
dc.l 0 ; gng_VisualInfo
dc.l 0 ; gng_UserData
RangeText: dc.b "Range",0
even
NewBaseS: dc.w 0 ; gng_LeftEdge
dc.w 0 ; gng_TopEdge
dc.w 0 ; gng_Width
dc.w 0 ; gng_Height
dc.l NewBaseText ; gng_GadgetText
dc.l 0 ; gng_TextAttr
dc.w GAD_NEWBASE ; gng_GadgetID
dc.l PLACETEXT_LEFT ; gng_Flags
dc.l 0 ; gng_VisualInfo
dc.l 0 ; gng_UserData
NewBaseText: dc.b "Base",0
even
PlacesS: dc.w 0 ; gng_LeftEdge
dc.w 0 ; gng_TopEdge
dc.w 0 ; gng_Width
dc.w 0 ; gng_Height
dc.l PlacesText ; gng_GadgetText
dc.l 0 ; gng_TextAttr
dc.w GAD_PLACES ; gng_GadgetID
dc.l PLACETEXT_LEFT ; gng_Flags
dc.l 0 ; gng_VisualInfo
dc.l 0 ; gng_UserData
PlacesText: dc.b "Places",0
even
StartValS: dc.w 0 ; gng_LeftEdge
dc.w 0 ; gng_TopEdge
dc.w 0 ; gng_Width
dc.w 0 ; gng_Height
dc.l StartValText ; gng_GadgetText
dc.l 0 ; gng_TextAttr
dc.w GAD_STARTVAL ; gng_GadgetID
dc.l PLACETEXT_LEFT ; gng_Flags
dc.l 0 ; gng_VisualInfo
dc.l 0 ; gng_UserData
StartValText: dc.b "Start value",0
even
LeadingS: dc.w 0 ; gng_LeftEdge
dc.w 0 ; gng_TopEdge
dc.w 0 ; gng_Width
dc.w 0 ; gng_Height
dc.l 0 ; gng_GadgetText
dc.l 0 ; gng_TextAttr
dc.w GAD_LEADING ; gng_GadgetID
dc.l 0 ; gng_Flags
dc.l 0 ; gng_VisualInfo
dc.l 0 ; gng_UserData
LeadingPtrs: dc.l NoLeadingText
dc.l LeadingText
dc.l 0
NoLeadingText: dc.b "No leading zeros",0
LeadingText: dc.b "Leading zeros",0
even
ConvertS: dc.w 0 ; gng_LeftEdge
dc.w 0 ; gng_TopEdge
dc.w 0 ; gng_Width
dc.w 0 ; gng_Height
dc.l ConvertText ; gng_GadgetText
dc.l 0 ; gng_TextAttr
dc.w GAD_CONVERT ; gng_GadgetID
dc.l PLACETEXT_IN ; gng_Flags
dc.l 0 ; gng_VisualInfo
dc.l 0 ; gng_UserData
ConvertText: dc.b "Convert",0
even
QuitS: dc.w 0 ; gng_LeftEdge
dc.w 0 ; gng_TopEdge
dc.w 0 ; gng_Width
dc.w 0 ; gng_Height
dc.l QuitText ; gng_GadgetText
dc.l 0 ; gng_TextAttr
dc.w GAD_QUIT ; gng_GadgetID
dc.l PLACETEXT_IN ; gng_Flags
dc.l 0 ; gng_VisualInfo
dc.l 0 ; gng_UserData
QuitText: dc.b "Quit",0
even
ForceS: dc.w 0 ; gng_LeftEdge
dc.w 0 ; gng_TopEdge
dc.w 0 ; gng_Width
dc.w 0 ; gng_Height
dc.l 0 ; gng_GadgetText
dc.l 0 ; gng_TextAttr
dc.w GAD_FORCE ; gng_GadgetID
dc.l 0 ; gng_Flags
dc.l 0 ; gng_VisualInfo
dc.l 0 ; gng_UserData
ForcePtrs: dc.l ForceOff
dc.l ForceOn
dc.l 0
ForceOff: dc.b "First",0
ForceOn: dc.b "Force",0
even
ForceIT: dc.b 0,0
dc.b 0,0
dc.w 0,0
dc.l 0
dc.l ForceOn
dc.l 0
DirectionS: dc.w 0 ; gng_LeftEdge
dc.w 0 ; gng_TopEdge
dc.w 0 ; gng_Width
dc.w 0 ; gng_Height
dc.l 0 ; gng_GadgetText
dc.l 0 ; gng_TextAttr
dc.w GAD_DIRECTION ; gng_GadgetID
dc.l 0 ; gng_Flags
dc.l 0 ; gng_VisualInfo
dc.l 0 ; gng_UserData
DirectionPtrs: dc.l DirSame
dc.l DirReverse
dc.l 0
DirSame: dc.b "Same Order",0
DirReverse: dc.b "Reversed Order",0
even
ActionS: dc.w 0 ; gng_LeftEdge
dc.w 0 ; gng_TopEdge
dc.w 0 ; gng_Width
dc.w 0 ; gng_Height
dc.l 0 ; gng_GadgetText
dc.l 0 ; gng_TextAttr
dc.w GAD_ACTION ; gng_GadgetID
dc.l 0 ; gng_Flags
dc.l 0 ; gng_VisualInfo
dc.l 0 ; gng_UserData
ActionPtrs: dc.l ActRename
dc.l ActCopy
dc.l ActCopyto
dc.l 0
ActRename: dc.b "Rename",0
ActCopy: dc.b "Copy",0
ActCopyto: dc.b "Copy To",0
even
PlaceUseS: dc.w 0 ; gng_LeftEdge
dc.w 0 ; gng_TopEdge
dc.w 0 ; gng_Width
dc.w 0 ; gng_Height
dc.l 0 ; gng_GadgetText
dc.l 0 ; gng_TextAttr
dc.w GAD_PLACEUSE ; gng_GadgetID
dc.l 0 ; gng_Flags
dc.l 0 ; gng_VisualInfo
dc.l 0 ; gng_UserData
;----------------------------------------------------------------------
BevelTags: dc.l GT_VisualInfo,0
dc.l TAG_DONE
;----------------------------------------------------------------------
_Window: dc.l 0
NewWindowTags: dc.l WA_Left,0
dc.l WA_Top,0
dc.l WA_Height,0
dc.l WA_Width,0
dc.l WA_Title,ArudTitle
dc.l WA_ScreenTitle,ArudScrTitle
dc.l WA_DetailPen,0
dc.l WA_BlockPen,1
dc.l WA_Gadgets,0
dc.l WA_DragBar,TRUE
dc.l WA_CloseGadget,TRUE
dc.l WA_DepthGadget,TRUE
dc.l WA_Activate,TRUE
dc.l WA_RMBTrap,TRUE
dc.l WA_IDCMP,IDCMP_CLOSEWINDOW!IDCMP_GADGETUP
dc.l TAG_DONE
ArudTitle: dc.b "Arud Converter V"
VER
dc.b "."
REV
dc.b 0
ArudScrTitle: dc.b "Arud Converter V"
VER
dc.b "."
REV
dc.b " by Morten Amundsen, 1993-1995.",0
ArudWorking: dc.b "Working...",0
even
TopazAttr: dc.l TopazName
dc.w 8
dc.b 0
dc.b FPF_ROMFONT
TopazName: dc.b "topaz.font",0
even